<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>属性的特性</title>
	</head>
	<body>
		
	</body>
</html>
<script>
	var obj = {
		name: "小明",
		age: 20
	};

	// hasOwnProperty 查看属性是不是该对象的自有属性
	// console.dir(obj.hasOwnProperty("name"));
	// console.log(obj.toString);
	// console.log(obj.hasOwnProperty("toString"));

	// var o = Object.create(null);
	// console.log(o.__proto__);

	// o2继承于obj
	// var o2 = Object.create(obj);
	// console.log(o2.__proto__);

	// 构造函数
	// new Object()
	console.dir(obj.constructor);
	console.dir(Object);

	// console.log(Object === obj.constructor);
	// console.log(obj.__proto__ === Object.prototype);
	// console.log(Object === Object.prototype.constructor);
	// console.log(Object.prototype.constructor.prototype.constructor === Object);

	// 查看obj对象name属性的特征
	// value: 属性的值
	// writable: 是否可写
	// enumerable: 是否可枚举
	// configurable: 是否可配置
	console.log(Object.getOwnPropertyDescriptor(obj, "name"));

	// 获取所有自有属性的特性
	console.log(Object.getOwnPropertyDescriptors(obj));

	Object.defineProperty(obj, "age", {
		value: 30,
		// 属性的可写性如果为false, 那么该属性的值就不能通过普通方法进行更改
		writable: false,
		// 如果该值为false, 那么该属性就不能够通过遍历查看
		enumerable: false,
		// 一旦该属性设置为false, 那么该属性就不能够再进行配置
		configurable: true
	});

	// console.log(obj);
	// obj.age = 29;
	// console.log(obj.age);
	// Object.defineProperty(obj, "age", {
	// 	value: 50
	// });
	// console.log(obj.age);
	// for (var key in obj) {
	// 	console.log(key);
	// }
	// 查看对象的所有key值
	console.log(Object.keys(obj));
	obj.age = 60;

	console.dir(obj);
	// 查看对象的属性是否可枚举
	console.log(obj.propertyIsEnumerable("name"));
	console.log(obj.propertyIsEnumerable("age"));

	// 给对象定义多个属性
	Object.defineProperties(obj, {
		"name": {value: "小刚"},
		"age": {value: 30, writable: true},
		"gender": {value: "男"}
	});
	console.log(obj);

	// 存储器属性
	var obj2 = {
		w: 5,
		h: 10,
		// 参数有且只有一个
		set square(obj) {
			console.log("setter设置方法");
			this.w = obj.w;
			this.h = obj.h;
			// 不能在这里给该属性设置值
			// this.square = {w: 1, h: 1};
		},
		get square() {
			console.log("getter获取方法")
			return this.w * this.h;
		}
	};
	Object.defineProperties(obj2, {
		w: {configurable: false, enumerable: false},
		h: {configurable: false, enumerable: false}
	});

	// 赋值走set方法
	obj2.square = {w: 200, h: 300};
	console.log(obj2.square);









</script>